/* ** por compatibilidad se omiten tildes **
================================================================================
 TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
================================================================================
  definicion de funciones del scheduler
*/

#include "sched.h"
#include "tss.h"

unsigned int indice = 15;

unsigned int tsi0 = 0;
unsigned int tsi = 0;
unsigned int tsi2 = 0;
unsigned int tss_a_guardar = 0;
unsigned int estoy_en_idle = 0;



//a)
void inicializar_sched(void){

	int j;
	for(j = 1; j < 9; j++)

		tss_copy(&tss_tanques[j-1], &sched[j]);
 
}


tss *prox_tss = &tss_next_1;
tss *anterior_tss = NULL;

unsigned short sched_proximo_indice(unsigned int pasar_a_idle) {
	if(anterior_tss == NULL){
		indice = 16;
		anterior_tss = prox_tss;
		prox_tss = &tss_next_2;
		tsi = 1;
		tss_copy(&sched[1], prox_tss);
	}
	else{
//		if(indice == 15){
//			breakpoint();
//			indice = 16;
//			tss_copy(anterior_tss, &sched[tsi2]);
//			anterior_tss = prox_tss;
//			prox_tss = &tss_next_2;
//		}
//		else{
//			indice = 15;
//			tss_copy(anterior_tss, &sched[tsi2]);
//			anterior_tss = prox_tss;
//			prox_tss = &tss_next_1;
//		}
		if(pasar_a_idle == 1){		//si paso a idle entonces estoy en una tarea distinta de idle
			tss_copy(anterior_tss, &sched[tsi0]);
			//tsi2 += 1;		//en la próxima llamada a esta función guardo tss_anterior en &sched[tsi2]
			//no incremento tsi
			tsi0 = tsi;
			tsi = 0;
			tss_copy(&sched[tsi], prox_tss);
			estoy_en_idle = 1;
		}
		else{
			if(estoy_en_idle == 1){
				tss_copy(anterior_tss, &sched[tsi0]);
				anterior_tss = prox_tss;
				prox_tss = &tss_next_1;
				tsi = tsi0 + 1;
				tsi0 = 0;
				tss_copy(&sched[tsi], prox_tss);
			}
			else{
				tss_copy(anterior_tss, &sched[tsi0]);
				if(indice == 15){
					indice = 16;
					anterior_tss = prox_tss;
					prox_tss = &tss_next_2;}
				else{
					indice = 15;
					anterior_tss = prox_tss;
					prox_tss = &tss_next_1;}
				//prox_tss = &tss_next_1;
				tsi0 = tsi;
				tsi += 1;
				tsi %= 9;
				tss_copy(&sched[tsi], prox_tss);
			}
//			tss_copy(&sched[tsi], prox_tss);
			estoy_en_idle = 0;
		}
	}


/*	if (indice == 15) {

		indice = 16;
		if(prox_tss->cr3 == 0x27000)
		tss_copy(prox_tss, &sched[0]);
		else
		tss_copy(prox_tss, &sched[tsi]);
		prox_tss = &tss_next_2;


	} else {


		indice = 15;
		if(prox_tss->cr3 == 0x27000)
		tss_copy(prox_tss, &sched[0]);
		else
		tss_copy(prox_tss, &sched[tsi]);
		prox_tss = &tss_next_1;

	}

	tsi += 1;
	tsi %= 9;	
	tss_copy(&sched[tsi], prox_tss);

*/	return indice;
}

unsigned short sched_pasar_a_idle(void) {
/*	if(anterior_tss == NULL){
		indice = 16;
		anterior_tss = prox_tss;
		prox_tss = &tss_next_2;
//		tss_copy(&sched[1], prox_tss);
	}
	else{
*/		if(indice == 15){
//			breakpoint();
			indice = 16;
			tss_copy(anterior_tss, &sched[tsi2]);
			anterior_tss = prox_tss;
			prox_tss = &tss_next_2;
		}
		else{
			indice = 15;
			tss_copy(anterior_tss, &sched[tsi2]);
			anterior_tss = prox_tss;
			prox_tss = &tss_next_1;
		}
//	}
	tsi2 += 1;
	tsi2 %= 9;
//	tsi += 1;
//	tsi %= 9;
	tss_copy(&sched[0], prox_tss);
/*

	if (indice == 15) {

		indice = 16;
		tss_copy(prox_tss, &sched[tsi]);
		prox_tss = &tss_next_2;


	} else {


		indice = 15;
		tss_copy(prox_tss, &sched[tsi]);
		prox_tss = &tss_next_1;

	}

//	tsi += 1;
//	tsi %= 9;	
	tss_copy(&sched[0], prox_tss);

*/	return indice;
}

unsigned int desalojar_tarea(void){

/*
	if(prox_tss == &tss_next_1){

		prox_tss = &tss_next_2;

		tss_copy(&sched[0], prox_tss);

		indice = 16;
			
	} else{ */

	


//		tss_copy(&sched[0], &tss_next_1);

		//indice = 15;

//	}
	
	return 1;

	//return indice;	
}











